package com.uniflow.mapper;

import com.uniflow.entity.Organization;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 组织架构数据访问层
 */
@Mapper
public interface OrganizationMapper {
    
    /**
     * 根据ID查询组织
     */
    Organization selectById(@Param("id") String id);
    
    /**
     * 根据名称查询组织
     */
    Organization selectByName(@Param("name") String name);
    
    /**
     * 根据外部ID和同步源查询组织
     */
    Organization selectByExternalId(@Param("externalId") String externalId, @Param("syncSource") String syncSource);
    
    /**
     * 查询所有组织
     */
    List<Organization> selectAll();
    
    /**
     * 查询组织列表
     */
    List<Organization> selectList(@Param("parentId") String parentId, @Param("keyword") String keyword);
    
    /**
     * 查询组织总数
     */
    Long selectCount(@Param("parentId") String parentId, @Param("keyword") String keyword);
    
    /**
     * 根据父级ID查询子组织列表
     */
    List<Organization> selectByParentId(@Param("parentId") String parentId);
    
    /**
     * 查询根组织列表
     */
    List<Organization> selectRootOrganizations();
    
    /**
     * 查询组织树结构
     */
    List<Organization> selectTree();
    
    /**
     * 插入组织
     */
    int insert(Organization organization);
    
    /**
     * 批量插入组织
     */
    int insertBatch(@Param("organizations") List<Organization> organizations);
    
    /**
     * 根据ID更新组织
     */
    int updateById(Organization organization);
    
    /**
     * 更新最后同步时间
     */
    int updateLastSyncAt(@Param("id") String id);
    
    /**
     * 根据ID删除组织
     */
    int deleteById(@Param("id") String id);
    
    /**
     * 批量删除组织
     */
    int deleteBatch(@Param("ids") List<String> ids);
    
    /**
     * 检查组织名称是否存在
     */
    boolean existsByName(@Param("name") String name, @Param("parentId") String parentId, @Param("excludeId") String excludeId);
    
    /**
     * 检查是否存在子组织
     */
    boolean hasChildren(@Param("id") String id);
    
    /**
     * 查询组织及其父级信息
     */
    Organization selectWithParent(@Param("id") String id);
    
    /**
     * 查询组织及其子级信息
     */
    Organization selectWithChildren(@Param("id") String id);
    
    /**
     * 查询组织及其负责人信息
     */
    Organization selectWithManager(@Param("id") String id);
    
    /**
     * 查询组织下的用户数量
     */
    Long selectUserCount(@Param("id") String id);
    
    /**
     * 查询组织路径（从根到当前组织）
     */
    List<Organization> selectPath(@Param("id") String id);
    
    /**
     * 查询组织的所有子孙组织ID
     */
    List<String> selectDescendantIds(@Param("id") String id);
}